﻿

#region << 版 本 注 释 >>
/*----------------------------------------------------------------
// Copyright (C) 2017 宁夏众智科技有限公司 版权所有。 
// 开源版本代码仅限个人技术研究使用，未经作者允许严禁商用。宁夏众智科技有限公司是一家油田自动化行业经营多年的软件开发公司，公司承接OA、工控、组态、微信小程序等开发。
// 对于本系统的相关版权归属宁夏众智科技所有，如果本系统使用第三方开源模块，该模块版权归属原作者所有。
// 请大家尊重作者的劳动成果，共同促进行业健康发展。
// 相关技术交流群89226196 ,作者QQ:249250126 作者微信18695221159 邮箱:my820403@126.com
// 创建者：马勇
//----------------------------------------------------------------*/
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Scada.DBUtility
{
  public   class MemoryCollect:IDisposable
    {
        private static TaskFactory factory = null;
        private static bool isRun = false;
        private static Task memoryTask;
        static CancellationTokenSource cts = null;
        public static void Monitor(TaskFactory taskFactory)
        {
            factory = taskFactory;
               cts = new CancellationTokenSource();
            isRun = true;
        
            memoryTask = Task.Run(() =>
            {
                Thread.Sleep(20000);
                while (isRun)
                {
                    if (cts!=null&&cts.Token.IsCancellationRequested)//如果检测到取消请求
                    {
                        break;
                    }
                    ClearMemory();
                    Thread.Sleep(2000);
                }



            }, cts.Token);

        }
        #region 内存回收
        [DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")]
        private static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
        /// <summary>
        /// 释放内存
        /// </summary>
        private static void ClearMemory()
        {

            factory.StartNew(() =>
            {


                try
                {
                    //通知屏幕保护程序，应用程序正在运行
                    SystemSleep.PreventForCurrentThread();
                    //设置应用程序占用内存最小
                    if (Environment.OSVersion.Platform == PlatformID.Win32NT || Environment.OSVersion.Platform == PlatformID.Win32Windows || Environment.OSVersion.Platform == PlatformID.Win32NT)
                    {
                        SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
                    }
                    //回收内存
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
             

                }
                catch
                {

                }
            });
        }

        public void Dispose()
        {

            isRun = false;
           if(memoryTask!=null)
            {
                cts.Cancel();
                cts.Dispose();
                cts = null;
                memoryTask.Dispose();
                memoryTask = null;
            }
        
            SystemSleep.RestoreForCurrentThread();
        }
        public static void Close()
        {
            isRun = false;
            if(cts!=null)
            {
                cts.Cancel();
                cts.Dispose();
            }
         
            cts = null;
            SystemSleep.RestoreForCurrentThread();
        }
        #endregion
    }
}
